package fleditor.core.loader
{
	import flash.events.Event;
	import flash.events.EventDispatcher;

	/**
	 * 加载队列 
	 * @author Devin
	 * 
	 */	
	public class LoaderQueue extends EventDispatcher
	{
		private var _loaders:Vector.<BaseLoader>;//加载队列 
		
		/**
		 *加载队列 
		 * 
		 */		
		public function LoaderQueue()
		{
			_loaders = new Vector.<BaseLoader>();//初始加载队列
		}
		
		/**
		 *增加加载项 
		 */		
		public function addLoader(loader:BaseLoader):void
		{
			_loaders.push(loader);
		}
		
		/**
		 *执行队列中的加载 
		 */		
		public function execute():void
		{
			var count:int = _loaders.length;
			for(var i:int = 0;i<count;i++)
			{
				var baseLoader:BaseLoader=_loaders[i];
				if(baseLoader.isLoading || baseLoader.isComplete || baseLoader.isSuccess) continue;
				baseLoader.addEventListener(LoaderEvent.COMPLETE, __onLoadComplete);
				LoaderFactory.Instance.execute(baseLoader);
			}
		}
		
		/**
		 * 加载列中如果有完成的加载项的完成事件 
		 * @param evt
		 * 
		 */		
		private function __onLoadComplete(evt:LoaderEvent):void
		{
			evt.baseLoader.removeEventListener(LoaderEvent.COMPLETE, __onLoadComplete);//当前加载项完成事件移除
			if(isAllComplete)
			{//如果加载列表中全部都加载完成
				removeEvent();
				dispatchEvent(new Event(Event.COMPLETE));//发出全部完成事件
			}
		}
		
		/**
		 *移除当前加载列表中每单项的事件 
		 * 
		 */		
		private function removeEvent():void
		{
			for(var i:int = 0;i<_loaders.length;i++)
			{
				_loaders[i].removeEventListener(LoaderEvent.COMPLETE, __onLoadComplete);//加载完成事件移除
			}
		}
		
		/**
		 *取得列表中的加载是否已全部加载完成(非全部成功) 
		 */		
		public function get isAllComplete():Boolean
		{
			for(var i:int = 0;i<_loaders.length;i++)
			{
				if(!_loaders[i].isComplete) return false;
			}
			return true;
		}
		
		/**
		 *取得列表中的加载是否已全部加载成功 
		 */		
		public function get isAllSuccess():Boolean
		{
			for(var i:int = 0;i<_loaders.length;i++)
			{
				if(!_loaders[i].isSuccess) return false;
			}
			return true;
		}
		
		/**
		 * 当前加载列表集项总数
		 * @return 
		 * 
		 */		
		public function get length():int
		{
			return _loaders.length;
		}
		
		/**
		 * 当前加载列表集 
		 * @return 
		 * 
		 */		
		public function get loaders():Vector.<BaseLoader>
		{
			return _loaders;
		}
		
		/**
		 * 资源释放 
		 * 
		 */		
		public function dispose():void
		{
			_loaders = null;
		}
	}
}